package 队列;

import java.util.ArrayDeque;
import java.util.Deque;

public class JZ59队列的最大值II {

    /**
     * 请定义一个队列并实现函数 max_value 得到队列里的最大值，
     * 要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
     * 若队列为空，pop_front 和 max_value 需要返回 -1
     *
     * 示例 1：
     * 输入:
     * ["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
     * [[],[1],[2],[],[],[]]
     * 输出: [null,null,null,2,1,2]
     * 示例 2：
     * 输入:
     * ["MaxQueue","pop_front","max_value"]
     * [[],[],[]]
     * 输出: [null,-1,-1]
     *  
     * 限制：
     * 1 <= push_back,pop_front,max_value的总操作数 <= 10000
     * 1 <= value <= 10^5
     */

    static class MaxQueue {

        private Deque<Integer> queue;
        private Deque<Integer> deque;

        public MaxQueue() {
            queue=new ArrayDeque<>();
            deque =new ArrayDeque<>();
        }

        public void push_back(int value) {
            queue.addLast(value);
            while (!deque.isEmpty()&& deque.getLast()<value){
                deque.removeLast();
            }
            deque.addLast(value);
        }

        public int max_value() {
            if(queue.isEmpty()){
                return -1;
            }
            return deque.peekFirst();
        }

        public int pop_front() {

            if(queue.isEmpty()){
                return -1;
            }

            Integer popNum = queue.removeFirst();
            if(popNum.equals(deque.peekFirst())){
                deque.removeFirst();
            }

            return popNum;
        }
    }

}
